
#ifndef _RADIX_ENGINE_CAMERA_H_
#define _RADIX_ENGINE_CAMERA_H_

#include <Engine/Header.h>

_BeginNamespace(Radix)

enum ProjectionMode
{
	eProjectionMode_Othotropic,
	eProjectionMode_Perspective
};

class ICamera :public Interface
{
public:
	virtual const String& name() = 0;
	virtual Vector3 position() = 0;
	virtual void setPosition(const Vector3& pos) = 0;
	virtual void setPosition(real x, real y, real z) = 0;
	virtual Vector3 direction() = 0;
	virtual void setDirection(const Vector3& dir) = 0;
	virtual void setDirection(real x, real y, real z) = 0;
	virtual Vector3 up() = 0;
	virtual void setUp(const Vector3& up) = 0;
	virtual void setUp(real x, real y, real z) = 0;
	
	virtual void strafe(real dist) = 0;
	virtual void fly(real dist) = 0;
	virtual void walk(real dist) = 0;
	virtual void pitch(real angle) = 0;
	virtual void yaw(real angle) = 0;
	virtual void roll(real angle) = 0;

	virtual ProjectionMode projectionMode() = 0;
	virtual void setProjectionMode(ProjectionMode pm) = 0;
	virtual real aspectRatio() = 0;
	virtual void setAspectRatio(real aspect) = 0;
	virtual real nearClipDistance() = 0;
	virtual void setNearClipDistance(real ncd) = 0;
	virtual real farClipDistance() = 0;
	virtual void setFarClipDistance(real fcd) = 0;
	virtual real nearFocalDistance() = 0;
	virtual void setNearFocalDistance(real nfd) = 0;
	virtual real farFocalDistance() = 0;
	virtual void setFarFocalDistance(real ffd) = 0;

	virtual Matrix4x4 calculateViewMatrix() = 0;
	virtual Matrix4x4 calculateProjMatrix() = 0;
};

_EndNamespace(Radix)

#endif//_RADIX_ENGINE_CAMERA_H_
